import { BodyItemConstant } from '../constants/InputItemConstants';
import { CirculatoryDiseasesAdvicesConstants, CirculatoryDiseasesRiskBaseDataConstants } from '../constants/CirculatoryDiseasesAdvicesConstants';
import CommonUtils from './CommonUtils';
const {
  GENDER,
  SMOKING_HABIT,
  ANTIHYPERTENSIVE_FLG,
  BLOOD_SUGAR_LEVEL_FASTING,
  BLOOD_SUGAR_LEVEL_ANYTIME,
  DIABETES_CURE_FLG,
} = BodyItemConstant;

const {
  HYPERTENSION_FLG,
  HYPOGLYCEMIA_FLG,
  NONHDL_FLG,
  HDL_FLG,
  TG_FLG,
  BLOOD_SUGAR_FLG,
  MAX_BLOOD_PRESSURE_FLG,
  MIN_BLOOD_PRESSURE_FLG,
  SUGAR_TOLERANCE_FLG,
  CALCULATE_RISK_LOW_FLG,
} = CirculatoryDiseasesAdvicesConstants;

const {
  RISK_BASE_PARAMETER_A,
  RISK_BASE_PARAMETER_B,
} = CirculatoryDiseasesRiskBaseDataConstants;

/**
 * 計算アドバイスなどで共通の処理をユーティリティ化
 */
export default class {

  /**
   * 画面入力値 男性：１、女性：２
   * @param {number} gender 性別
   * @returns １：男性、０：女性
   */
  static _getGenderValue(gender) {
    return gender === GENDER.MALE.value ? 1 : 0;
  }

  /**
   * 喫煙の有無
   * @param {number} smokingHabit 喫煙習慣
   * @returns ０:ない 1:ある
   */
  static _getSmokingValue(smokingHabit) {
    return smokingHabit > SMOKING_HABIT.IS_SMOKING.value ? 0 : 1;
  }

  /**
   * HDLコレステロールにより、non-HDL値を生成する
   * @param {number} hdlCholesterol   HDLコレステロール
   * @param {number} ldlCholesterol   LDLコレステロール
   * @param {number} totalCholesterol 総コレステロール
   * @param {number} triglyceride     中性脂肪
   * @returns non-HDL値
   */
  static _getNonHdlValue(hdlCholesterol, ldlCholesterol, totalCholesterol, triglyceride) {
    // LDLコレステロール値 > 0 且つ 中性脂肪 > 0 の場合
    if (ldlCholesterol > 0 && triglyceride > 0) {
      // LDLコレステロール + 中性脂肪 / 5
      return ldlCholesterol + triglyceride / 5;
    } else {
      // 総コレステロール - HDLコレステロール
      return totalCholesterol - hdlCholesterol;
    }
  }

  /**
   * 高血圧の判定
   * @param {number} antihypertensiveFlg 降圧剤
   * @param {number} maxBloodPressure    最高血圧(収縮期)
   * @param {number} minBloodPressure    最低血圧(拡張期)
   * @returns ０:ない(○) 1:ある(×)
   */
  static isHypertension(antihypertensiveFlg, maxBloodPressure, minBloodPressure) {

    // 降圧剤の服用無
    if (antihypertensiveFlg === ANTIHYPERTENSIVE_FLG.NO.value) {

      // 収縮期140mmHg未満 且つ 拡張期90mmHg未満
      if (maxBloodPressure < 140 && minBloodPressure < 90) {
        return HYPERTENSION_FLG.NO;
      }

      // 収縮期140mmHg以上or拡張期90mmHg以上
      return HYPERTENSION_FLG.YES;

    }

    // 治療あり
    return HYPERTENSION_FLG.YES;
  }

  /**
   * 高低血糖の判定
   * @param {number} bloodSugarLevelFasting  血糖値（空腹時）【mg/dl】
   * @param {number} bloodSugarLevelAnytime  血糖値（随時）【mg/dl】
   * @returns 0 : なし(○)  1:ある(×)
   */
  static isHypoglycemia(bloodSugarLevelFasting, bloodSugarLevelAnytime) {

    // 空腹時
    if (bloodSugarLevelFasting !== undefined) {

      // 空腹時血糖100mg/dL未満
      if (bloodSugarLevelFasting === BLOOD_SUGAR_LEVEL_FASTING.LOW.value) {
        return HYPOGLYCEMIA_FLG.NO;
      }

      // 100≦空腹時血糖＜126mg/dL
      if (bloodSugarLevelFasting === BLOOD_SUGAR_LEVEL_FASTING.MIDDLE.value) {
        return HYPOGLYCEMIA_FLG.YES;
      }
    }

    // 随時
    if (bloodSugarLevelAnytime !== undefined) {

      // 随時血糖140mg/dL未満
      if (bloodSugarLevelAnytime === BLOOD_SUGAR_LEVEL_ANYTIME.LOW.value) {
        return HYPOGLYCEMIA_FLG.NO;
      }

      // 140≦随時血糖＜200mg/dL
      if (bloodSugarLevelAnytime === BLOOD_SUGAR_LEVEL_ANYTIME.MIDDLE.value) {
        return HYPOGLYCEMIA_FLG.YES;
      }
    }

    return HYPOGLYCEMIA_FLG.YES;
  }

  /**
   * 耐糖能異常の等級を取得する
   * @param {number} diabetesCureFlg         糖尿病の治療の有無
   * @param {number} bloodSugarLevelFasting  血糖値（空腹時）【mg/dl】
   * @param {number} bloodSugarLevelAnytime  血糖値（随時）【mg/dl】
   */
  static _getSugartoleranceByBloodSugarLevel(diabetesCureFlg, bloodSugarLevelFasting, bloodSugarLevelAnytime) {

    // 糖尿病の治療なし
    if (diabetesCureFlg === DIABETES_CURE_FLG.NO.value) {

      // 空腹時
      if (bloodSugarLevelFasting !== undefined) {

        // 空腹時血糖100mg/dL未満
        if (bloodSugarLevelFasting === BLOOD_SUGAR_LEVEL_FASTING.LOW.value) {
          return SUGAR_TOLERANCE_FLG.GOOD;
        }

        // 100≦空腹時血糖＜126mg/dL
        if (bloodSugarLevelFasting === BLOOD_SUGAR_LEVEL_FASTING.MIDDLE.value) {
          return SUGAR_TOLERANCE_FLG.SLIGHTLY;
        }

        // 空腹時126mg/dL以上
        return SUGAR_TOLERANCE_FLG.BAD;
      }

      // 随時
      if (bloodSugarLevelAnytime !== undefined) {

        // 随時血糖140mg/dL未満
        if (bloodSugarLevelAnytime === BLOOD_SUGAR_LEVEL_ANYTIME.LOW.value) {
          return SUGAR_TOLERANCE_FLG.GOOD;
        }

        // 140≦随時血糖＜200mg/dL
        if (bloodSugarLevelAnytime === BLOOD_SUGAR_LEVEL_ANYTIME.MIDDLE.value) {
          return SUGAR_TOLERANCE_FLG.SLIGHTLY;
        }

        // 随時200mg/dL以上
        return SUGAR_TOLERANCE_FLG.BAD;
      }
    }

    // 糖尿病の治療あり
    return SUGAR_TOLERANCE_FLG.GOOD;

  }

  /**
   * 血糖値(空腹時/随時)により、血糖の等級を取得する
   * @param {number} bloodSugarLevelFasting  血糖値（空腹時）【mg/dl】
   * @param {number} bloodSugarLevelAnytime  血糖値（随時）【mg/dl】
   * @returns 1 : 血糖良好  2 : 血糖やや不良 3 : 血糖不良
   *
   */
  static _getGradesByBloodSugarLevel(bloodSugarLevelFasting, bloodSugarLevelAnytime) {
    // 空腹時
    if (bloodSugarLevelFasting !== undefined) {

        // 空腹時99mg/dL以下
      if (bloodSugarLevelFasting === BLOOD_SUGAR_LEVEL_FASTING.LOW.value) {
        return BLOOD_SUGAR_FLG.GOOD;
      }

      // 空腹時100～125mg/dL
      if (bloodSugarLevelFasting === BLOOD_SUGAR_LEVEL_FASTING.MIDDLE.value) {
        return BLOOD_SUGAR_FLG.SLIGHTLY;
      }

      // 空腹時126mg/dL以上
      return BLOOD_SUGAR_FLG.BAD;

    // 随時
    } else {

      // 随時139mg/dL以下
      if (bloodSugarLevelAnytime === BLOOD_SUGAR_LEVEL_ANYTIME.LOW.value) {
        return BLOOD_SUGAR_FLG.GOOD;
      }

      // 随時140-199mg/dL
      if (bloodSugarLevelAnytime === BLOOD_SUGAR_LEVEL_ANYTIME.MIDDLE.value) {
        return BLOOD_SUGAR_FLG.SLIGHTLY;
      }

      // 随時200mg/dL以上
      return BLOOD_SUGAR_FLG.BAD;
    }
  }

  /**
   * 最高血圧(収縮期)により、血圧の等級を取得する
   * @param {number} maxBloodPressure        最高血圧(収縮期)
   * @returns 1 : S良好  2 : Sやや不良 3 : S不良
   */
  static _getGradesByMaxBloodPressure(maxBloodPressure) {

    // 収縮期139mmHg以下
    if (maxBloodPressure <= 139) {
      return MAX_BLOOD_PRESSURE_FLG.S_GOOD;
    }

    // 収縮期140～179mmHg
    if (maxBloodPressure >= 140 && maxBloodPressure <= 179) {
      return MAX_BLOOD_PRESSURE_FLG.S_SLIGHTLY;
    }

    // 収縮期180mmHg以上
    return MAX_BLOOD_PRESSURE_FLG.S_BAD;
  }

  /**
   * 最低血圧(拡張期)により、血圧の等級を取得する
   * @param {number} minBloodPressure        最低血圧(拡張期)
   * @returns 1 : D良好  2 : Dやや不良 3 : D不良
   */
  static _getGradesByMinBloodPressure(minBloodPressure) {

    // 拡張期89mmHg以下
    if (minBloodPressure <= 89) {
      return MIN_BLOOD_PRESSURE_FLG.D_GOOD;
    }

    // 拡張期90～109mmHg
    if (minBloodPressure >= 90 && minBloodPressure <= 109) {
      return MIN_BLOOD_PRESSURE_FLG.D_SLIGHTLY;
    }

    // 拡張期110mmHg以上
    return MIN_BLOOD_PRESSURE_FLG.D_BAD;
  }

  /**
   * HDLを判定する
   * @param {number} hdlCholesterol   HDLコレステロール
   * @returns 1 : 良好 0 : 不良
   */
  static isGoodHDL(hdlCholesterol) {

    // 40≦HDL-C
    if (hdlCholesterol >= 40) {
      return HDL_FLG.YES;
    }

    // 40>HDL-C
    return HDL_FLG.NO;
  }

  /**
   * TGを判定する
   * @param {number} triglyceride     中性脂肪
   * @returns 1 : 良好 0 : 不良
   */
  static isGoodTG(triglyceride) {

    // 150>TG
    if (triglyceride < 150) {
      return TG_FLG.YES;
    }

    // 150≦TG
    return TG_FLG.NO;
  }

  /**
   * ageの種類を判定する
   * @param {number} age   年齢
   * @param {number} kind  区別の種類
   * @returns 1 : 不一致 0 : 一致
   */
  static matchAge(age, kind) {

    switch (kind) {
      case 1:
        if (40 <= age && age < 50) return 0;
        break;
      case 2:
        if (50 <= age && age < 60) return 0;
        break;
      case 3:
        if (60 <= age && age < 80) return 0;
        break;
      case 4:
        if (40 <= age && age < 60) return 0;
        break;
      default:
        break;
    }
    return 1;
  }

  /**
   * non-HDLの種類を判定する
   * @param {number} nonHdlValue non-HDL数値
   * @param {number} kind  区別の種類
   * @returns 1 : 不一致 0 : 一致
   */
  static matchNonHdl(nonHdlValue,kind) {

    switch (kind) {
      case 1:
        if (nonHdlValue >= 150) return 0;
        break;
      case 2:
        if (nonHdlValue >= 170) return 0;
        break;
      case 3:
        if (nonHdlValue >= 190) return 0;
        break;
      default:
        break;
    }
    return 1;
  }

  /**
   * non-HDL値の評価は性別、年齢、喫煙、高血圧、血糖値、糖尿病治療有無、non-HDL数値の組合せによって行う
   * @param {number} genderValue             性別
   * @param {number} age                     年齢
   * @param {number} smokingValue            喫煙習慣
   * @param {number} isHypertension          高血圧
   * @param {number} isHypoglycemia          高低血糖
   * @param {number} diabetesCureFlg         糖尿病の治療の有無
   * @param {number} nonHdlValue             non-HDL数値
   * @returns 1 : 良好 0：不良
   */
  static isGoodNonHdl(genderValue, age, smokingValue, isHypertension, isHypoglycemia, diabetesCureFlg, nonHdlValue) {

    const matchArray = [[1,1,0,0,0,0,3],
                        [1,1,1,0,0,0,2],
                        [1,1,0,1,0,0,2],
                        [1,1,0,0,1,0,2],
                        [1,1,1,1,0,0,2],
                        [1,1,1,0,1,0,2],
                        [1,1,0,1,1,0,2],
                        [1,1,1,1,1,0,1],
                        [1,1,0,0,0,1,1],
                        [1,1,1,0,0,1,1],
                        [1,1,0,1,0,1,1],
                        [1,1,0,0,1,1,1],
                        [1,1,1,1,0,1,1],
                        [1,1,1,0,1,1,1],
                        [1,1,0,1,1,1,1],
                        [1,1,1,1,1,1,1],
                        [1,2,0,0,0,0,2],
                        [1,2,1,0,0,0,2],
                        [1,2,0,1,0,0,2],
                        [1,2,0,0,1,0,2],
                        [1,2,1,1,0,0,1],
                        [1,2,1,0,1,0,1],
                        [1,2,0,1,1,0,1],
                        [1,2,1,1,1,0,1],
                        [1,2,0,0,0,1,1],
                        [1,2,1,0,0,1,1],
                        [1,2,0,1,0,1,1],
                        [1,2,0,0,1,1,1],
                        [1,2,1,1,0,1,1],
                        [1,2,1,0,1,1,1],
                        [1,2,0,1,1,1,1],
                        [1,2,1,1,1,1,1],
                        [1,3,0,0,0,0,2],
                        [1,3,1,0,0,0,1],
                        [1,3,0,1,0,0,1],
                        [1,3,0,0,1,0,1],
                        [1,3,1,1,0,0,1],
                        [1,3,1,0,1,0,1],
                        [1,3,0,1,1,0,1],
                        [1,3,1,1,1,0,1],
                        [1,3,0,0,0,1,1],
                        [1,3,1,0,0,1,1],
                        [1,3,0,1,0,1,1],
                        [1,3,0,0,1,1,1],
                        [1,3,1,1,0,1,1],
                        [1,3,1,0,1,1,1],
                        [1,3,0,1,1,1,1],
                        [1,3,1,1,1,1,1],
                        [0,4,0,0,0,0,3],
                        [0,4,1,0,0,0,3],
                        [0,4,0,1,0,0,3],
                        [0,4,0,0,1,0,3],
                        [0,4,1,1,0,0,2],
                        [0,4,1,0,1,0,2],
                        [0,4,0,1,1,0,2],
                        [0,4,1,1,1,0,2],
                        [0,4,0,0,0,1,1],
                        [0,4,1,0,0,1,1],
                        [0,4,0,1,0,1,1],
                        [0,4,0,0,1,1,1],
                        [0,4,1,1,0,1,1],
                        [0,4,1,0,1,1,1],
                        [0,4,0,1,1,1,1],
                        [0,4,1,1,1,1,1],
                        [0,3,0,0,0,0,2],
                        [0,3,1,0,0,0,2],
                        [0,3,0,1,0,0,2],
                        [0,3,0,0,1,0,2],
                        [0,3,1,1,0,0,1],
                        [0,3,1,0,1,0,1],
                        [0,3,0,1,1,0,1],
                        [0,3,1,1,1,0,1],
                        [0,3,0,0,0,1,1],
                        [0,3,1,0,0,1,1],
                        [0,3,0,1,0,1,1],
                        [0,3,0,0,1,1,1],
                        [0,3,1,1,0,1,1],
                        [0,3,1,0,1,1,1],
                        [0,3,0,1,1,1,1],
                        [0,3,1,1,1,1,1]];

    for (let i = 0, n = matchArray.length; i < n; i++) {
      if (genderValue === matchArray[i][0] &&
         this.matchAge(age, matchArray[i][1]) === 0 &&
         smokingValue === matchArray[i][2] &&
         isHypertension === matchArray[i][3] &&
         isHypoglycemia === matchArray[i][4] &&
         diabetesCureFlg === matchArray[i][5] &&
         this.matchNonHdl(nonHdlValue, matchArray[i][6]) === 0)

        return NONHDL_FLG.NO;
    }

    return NONHDL_FLG.YES;
  }

  /**
   * アドバイス用の中間値生成(性別,喫煙フラグ、高血圧、高低血糖、non-HDL値、HDLの判定、TGの判定、non_Hdlの判定 )
   * @param {number} bodyHeight              身長（cm）
   * @param {number} bodyWeight              体重（kg）
   * @param {number} gender                  性別
   * @param {number} age                     年齢
   * @param {number} smokingHabit            喫煙習慣
   * @param {number} antihypertensiveFlg     降圧剤
   * @param {number} maxBloodPressure        最高血圧(収縮期)
   * @param {number} minBloodPressure        最低血圧(拡張期)
   * @param {number} bloodSugarLevelFasting  血糖値（空腹時）【mg/dl】
   * @param {number} bloodSugarLevelAnytime  血糖値（随時）【mg/dl】
   * @param {number} hdlCholesterol          HDLコレステロール
   * @param {number} ldlCholesterol          LDLコレステロール
   * @param {number} totalCholesterol        総コレステロール
   * @param {number} triglyceride            中性脂肪
   * @param {number} diabetesCureFlg         糖尿病の治療の有無
   * @returns (性別,喫煙フラグ、高血圧、高低血糖、non-HDL値、HDLの判定、TGの判定、non_Hdlの判定 )
   */
  static _calcAdvicesMiddleParameter(bodyHeight,
                                     bodyWeight,
                                     gender,
                                     age,
                                     smokingHabit,
                                     antihypertensiveFlg,
                                     maxBloodPressure,
                                     minBloodPressure,
                                     bloodSugarLevelFasting,
                                     bloodSugarLevelAnytime,
                                     hdlCholesterol,
                                     ldlCholesterol,
                                     totalCholesterol,
                                     triglyceride,
                                     diabetesCureFlg) {

    // 性別を取得する
    const genderValue = this._getGenderValue(gender);

    // 喫煙の有無
    const smokingValue = this._getSmokingValue(smokingHabit);

    // BMIを取得する
    const bmi = CommonUtils.calcBMI(bodyHeight, bodyWeight);

    // 高血圧の判定
    const isHypertension = this.isHypertension(antihypertensiveFlg, maxBloodPressure, minBloodPressure);

    // 高低血糖の判定
    const isHypoglycemia = this.isHypoglycemia(bloodSugarLevelFasting, bloodSugarLevelAnytime);

    // 糖尿病の治療の有無により耐糖能異常の等級を取得する
    const SugartoleranceGrades = this._getSugartoleranceByBloodSugarLevel(diabetesCureFlg, bloodSugarLevelFasting, bloodSugarLevelAnytime)

    // 血糖の等級を取得する
    const bloodSugarGrades = this._getGradesByBloodSugarLevel(bloodSugarLevelFasting, bloodSugarLevelAnytime);

    // 最高血圧(収縮期)の等級を取得する
    const maxBloodPressureGrades = this._getGradesByMaxBloodPressure(maxBloodPressure);

    // 最低血圧(拡張期)の等級を取得する
    const minBloodPressureGrades = this._getGradesByMinBloodPressure(minBloodPressure);

    // non-HDL値
    const nonHdlValue = this._getNonHdlValue(hdlCholesterol, ldlCholesterol, totalCholesterol, triglyceride);

    // HDLを判定する
    const isGoodHDL = this.isGoodHDL(hdlCholesterol);

    // TGを判定する
    const isGoodTG = this.isGoodTG(triglyceride);

    // non_Hdlを判定する
    const isGoodNonHdl = this.isGoodNonHdl(genderValue, age, smokingValue, isHypertension, isHypoglycemia, diabetesCureFlg, nonHdlValue)

    // 血糖値が良好になると、あなたのリスクの計算必要ですか。
    const isCalculateRiskByBloodSugar = this.isCalculateRiskByBloodSugar(diabetesCureFlg, bloodSugarLevelFasting, bloodSugarLevelAnytime);

    // 血圧のコントロールが良好になると、あなたのリスクの計算必要ですか。
    const isCalculateRiskByBloodPressure = this.isCalculateRiskByBloodPressure(maxBloodPressure, minBloodPressure);

    // MIが25未満になると、あなたのリスクの計算必要ですか。
    const isCalculateRiskByBMI = this.isCalculateRiskByBMI(bmi);

    // 脂質のコントロールが良好になると、あなたのリスクの計算必要ですか。
    const isCalculateRiskByLipid = this.isCalculateRiskByLipid(isGoodHDL, isGoodTG, isGoodNonHdl);

    // 十分に低いリスクの基準データを作成する
    let riskBaseParameter = this._getRiskBaseParameter(gender, genderValue, age);

    return {
      genderValue,
      smokingValue,
      bmi,
      isHypertension,
      SugartoleranceGrades,
      bloodSugarGrades,
      maxBloodPressureGrades,
      minBloodPressureGrades,
      nonHdlValue,
      isHypoglycemia,
      isGoodHDL,
      isGoodTG,
      isGoodNonHdl,
      isCalculateRiskByBloodSugar,
      isCalculateRiskByBloodPressure,
      isCalculateRiskByBMI,
      isCalculateRiskByLipid,
      riskBaseParameter,
    };
  }

  /**
   * 脂質基準対応するIDを取得する
   * @param {number} isGoodHDL                  HDLの判定
   * @param {number} isGoodTG                   TGの判定
   * @param {number} isGoodNonHdl               non_Hdlを判定
   * @param {number} triglyceride               中性脂肪
   * @returns 脂質基準対応するID
   */
  static _getLipidStandardId(isGoodHDL, isGoodTG, isGoodNonHdl, triglyceride) {

    // TG未入力
    if (triglyceride === undefined) {

      // HDL良好（40≦HDL-C）且つ non-HDL良好
      if (isGoodHDL === HDL_FLG.YES &&
          isGoodNonHdl === NONHDL_FLG.YES) {

        return 'XMX';
      }

      // HDL良好（40≦HDL-C）且つ non-HDL不良
      if (isGoodHDL === HDL_FLG.YES &&
          isGoodNonHdl === NONHDL_FLG.NO) {

        return 'XMN';
      }

      // HDL不良（HDL-C<40）且つ non-HDL良好
      if (isGoodHDL === HDL_FLG.NO &&
          isGoodNonHdl === NONHDL_FLG.YES) {

        return 'HMX';
      }

      // HDL不良（HDL<40）且つ non-HDL不良
      return 'HMN';
    }


    // HDL良好（40≦HDL-C）且つ TG良好（TG<150）且つ non-HDL不良
    if (isGoodHDL === HDL_FLG.YES &&
        isGoodTG === TG_FLG.YES &&
        isGoodNonHdl === NONHDL_FLG.NO) {

      return 'XXN';
    }

    // HDL良好（40≦HDL-C）且つ TG不良（150≦TG）non-HDL良好
    if (isGoodHDL === HDL_FLG.YES &&
        isGoodTG === TG_FLG.NO &&
        isGoodNonHdl === NONHDL_FLG.YES) {

      return 'XTX';
    }

    // HDL良好（40≦HDL-C）且つ TG不良（150≦TG）non-HDL不良
    if (isGoodHDL === HDL_FLG.YES &&
        isGoodTG === TG_FLG.NO &&
        isGoodNonHdl === NONHDL_FLG.NO) {

      return 'XTN';
    }

    // HDL不良（HDL-C<40）且つ TG良好（TG<150）non-HDL良好
    if (isGoodHDL === HDL_FLG.NO &&
        isGoodTG === TG_FLG.YES &&
        isGoodNonHdl === NONHDL_FLG.YES) {

      return 'HXX';
    }

    // HDL不良（HDL-C<40）且つ TG良好（TG<150）non-HDL不良
    if (isGoodHDL === HDL_FLG.NO &&
        isGoodTG === TG_FLG.YES &&
        isGoodNonHdl === NONHDL_FLG.NO) {

      return 'HXN';
    }

    // HDL不良（HDL-C<40）且つ TG不良（150≦TG）non-HDL良好
    if (isGoodHDL === HDL_FLG.NO &&
        isGoodTG === TG_FLG.NO &&
        isGoodNonHdl === NONHDL_FLG.YES) {

      return 'HTX';
    }

    // HDL不良（HDL-C<40）且つ TG不良（150≦TG）non-HDL不良
    return 'HTN';
  }

  /**
   * 肥満・喫煙・血圧対応するアドバイスIDを取得する
   * @param {number} bmi                     BMI
   * @param {number} smokingValue            喫煙習慣
   * @param {number} isHypertension          高血圧の判定
   * @returns 肥満・喫煙・血圧対応するアドバイスID
   */
  static _getObeseSmokeBPressureId(bmi, smokingValue, diabetesCureFlg, isHypertension) {

    // BMI<25 && 喫煙なし && N高血圧なし
    if (bmi < 25 &&
        smokingValue !== SMOKING_HABIT.IS_SMOKING.value &&
        isHypertension === HYPERTENSION_FLG.NO) {

      return 'XXX';
    }

    // BMI<25 && 喫煙なし && N高血圧あり
    if (bmi < 25 &&
      smokingValue !== SMOKING_HABIT.IS_SMOKING.value &&
      isHypertension === HYPERTENSION_FLG.YES) {

      return 'XXP';
    }

    // BMI<25 && 喫煙あり && N高血圧なし
    if (bmi < 25 &&
        smokingValue === SMOKING_HABIT.IS_SMOKING.value &&
        isHypertension === HYPERTENSION_FLG.NO) {

      return 'XSX';
    }

    // BMI<25 && 喫煙あり && N高血圧あり
    if (bmi < 25 &&
        smokingValue === SMOKING_HABIT.IS_SMOKING.value &&
        isHypertension === HYPERTENSION_FLG.YES) {

      return 'XSP';
    }

    // BMI>=25 && 喫煙なし && N高血圧なし
    if (bmi >= 25 &&
        smokingValue !== SMOKING_HABIT.IS_SMOKING.value &&
        isHypertension === HYPERTENSION_FLG.NO) {

      return 'OXX';
    }

    // BMI>=25 && 喫煙なし && N高血圧あり
    if (bmi >= 25 &&
        smokingValue !== SMOKING_HABIT.IS_SMOKING.value &&
        isHypertension === HYPERTENSION_FLG.YES) {

      return 'OXP';
    }

    // BMI>=25 && 喫煙あり && N高血圧なし
    if (bmi >= 25 &&
        smokingValue === SMOKING_HABIT.IS_SMOKING.value &&
        isHypertension === HYPERTENSION_FLG.NO) {

      return 'OSX';
    }

    // BMI>=25 && 喫煙あり && N高血圧あり
    return 'OSP';
  }

  /**
   * 血糖基準対応するIDを取得する
   * @param {number} diabetesCureFlg         糖尿病の治療の有無
   * @param {number} SugartoleranceGrades    血糖の等級
   * @returns 血糖基準対応するID
   */
  static _getBloodSugarStandardId(diabetesCureFlg, SugartoleranceGrades) {

    // 糖尿病治療なし
    if (diabetesCureFlg === DIABETES_CURE_FLG.NO.value) {

      // 耐糖能異常なし
      if (SugartoleranceGrades === SUGAR_TOLERANCE_FLG.GOOD) {
        return 'XX';
      }

      // 耐糖能異常あり（I）
      if (SugartoleranceGrades === SUGAR_TOLERANCE_FLG.SLIGHTLY) {
        return 'XI';
      }

      // 耐糖能異常あり（A）
      return 'XA';
    }

    // 糖尿病治療あり
    return 'DX';
  }

  /**
   * 血糖値が良好になると、あなたのリスクの計算必要ですか。
   * @param {number} diabetesCureFlg         糖尿病の治療の有無
   * @param {number} bloodSugarLevelFasting  血糖値（空腹時）【mg/dl】
   * @param {number} bloodSugarLevelAnytime  血糖値（随時）【mg/dl】
   * @returns 1 : 必要です 0 : 必要でない
   */
  static isCalculateRiskByBloodSugar(diabetesCureFlg, bloodSugarLevelFasting, bloodSugarLevelAnytime) {

    // 糖尿病治療なし
    if (diabetesCureFlg === DIABETES_CURE_FLG.NO.value) {
      return this.isHypoglycemia(bloodSugarLevelFasting, bloodSugarLevelAnytime);
    }

    // 糖尿病治療あり
    return CALCULATE_RISK_LOW_FLG.NO;
  }

  /**
   * 血圧のコントロールが良好になると、あなたのリスクの計算必要ですか。
   * @param {number} maxBloodPressure    最高血圧(収縮期)
   * @param {number} minBloodPressure    最低血圧(拡張期)
   * @returns 1 : 必要です 0 : 必要でない
   */
  static isCalculateRiskByBloodPressure(maxBloodPressure, minBloodPressure) {

    // 収縮期血圧140mmHg以上、または拡張期血圧90mmHg以上の場合
    if (maxBloodPressure >= 140 || minBloodPressure >= 90) {
      return CALCULATE_RISK_LOW_FLG.YES;
    }

    return CALCULATE_RISK_LOW_FLG.NO;
  }

  /**
   * BMIが25未満になると、あなたのリスクの計算必要ですか。
   * @param {number} bmi    BMI
   * @returns 1 : 必要です 0 : 必要でない
   */
  static isCalculateRiskByBMI(bmi) {

    // BMIが25以上の場合
    if (bmi >= 25) {
      return CALCULATE_RISK_LOW_FLG.YES;
    }

    return CALCULATE_RISK_LOW_FLG.NO;
  }

  /**
   * 脂質のコントロールが良好になると、あなたのリスクの計算必要ですか。
   * @param {number} isGoodHDL                HDLの判定
   * @param {number} isGoodTG                 TGの判定
   * @param {number} isGoodNonHdl             non_Hdlの判定
   * @returns 1 : 必要です 0 : 必要でない
   */
  static isCalculateRiskByLipid(isGoodHDL, isGoodTG, isGoodNonHdl) {

    // HDL-C39mg不良の場合
    if (isGoodHDL === HDL_FLG.NO) {
      return CALCULATE_RISK_LOW_FLG.YES;
    }

    // TG150mg/dl以上
    if (isGoodTG === TG_FLG.NO) {
      return CALCULATE_RISK_LOW_FLG.YES;
    }

    // non-HDL不良の場合
    if (isGoodNonHdl === NONHDL_FLG.NO) {
      return CALCULATE_RISK_LOW_FLG.YES;
    }

    return CALCULATE_RISK_LOW_FLG.NO;
  }

  /**
	 * 十分に低いリスクの基準データを作成する
   * @param {number} gender      性別(入力値)
   * @param {number} genderValue      性別
   * @param {number} age              年齢
	 */
  static _getRiskBaseParameter(gender, genderValue, age) {

    let riskBaseParameter;

    // 男性
    if (genderValue === GENDER.MALE.value) {

      // 50歳未満
      if (age < 50) {
        riskBaseParameter = RISK_BASE_PARAMETER_A;
      } else {
        riskBaseParameter = RISK_BASE_PARAMETER_B
      }

    // 女性
    } else {

      // 50歳未満
      if (age < 60) {
        riskBaseParameter = RISK_BASE_PARAMETER_A;
      } else {
        riskBaseParameter = RISK_BASE_PARAMETER_B
      }
    }

    riskBaseParameter.age = age;
    riskBaseParameter.gender = gender;

    return riskBaseParameter;
  }
}
